#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QIcon>
#include <QScreen>
#include <QRect>
#include <QDebug>
#include "sessionsetting.h"
#include <QStandardItemModel>
#include <QSerialPort>
#include <QSerialPortInfo>
#include <QMessageBox>

/*****************************************************
 *  @author:Yz
 *  @brief:构造函数
 *  @para:void
 *  @return:void
 *  @date:2024/11/25
 *  @version:1.0
 * ***************************************************/
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    run();
}

/*****************************************************
 *  @author:Yz
 *  @brief:析构函数
 *  @para:void
 *  @return:void
 *  @date:2024/11/25
 *  @version:1.0
 * ***************************************************/
MainWindow::~MainWindow()
{
    delete ui;
}

/*****************************************************
 *  @author:Yz
 *  @brief:程序运行的入口
 *  @para:void
 *  @return:void
 *  @date:2024/11/25
 *  @version:1.0
 * ***************************************************/
void MainWindow::run()
{
    system_init();
}

/*****************************************************
 *  @author:Yz
 *  @brief:程序的系统初始化
 *  @para:void
 *  @return:void
 *  @date:2024/11/25
 *  @version:1.0
 * ***************************************************/
void MainWindow::system_init()
{
    //设置图标和标题
    this->setWindowTitle("Mini_Serial_Assistant");
    this->setWindowIcon(QIcon(":/res/pic/serial.png"));

    //获取电脑的尺寸，配置程序尺寸
    QScreen *screen = QGuiApplication::primaryScreen();
    QRect rect = screen->availableGeometry();

    int width = rect.size().width();
    int height = rect.size().height();
    //qDebug()<<"width"<<width<<"height"<<height<<endl;

    this->resize(width / 3 * 2,height / 3 * 2);
    int pre_height = ui->btn_quit->height();
    ui->btn_quit->move(width,pre_height);

    //设置目录和显示UI的拉伸因子
    ui->splitter->setStretchFactor(0, 1);
    ui->splitter->setStretchFactor(1, 8);

    /********************************** 设置 treeView ************************/
    model = new QStandardItemModel(this);

    // 添加顶层节点
    QStandardItem *parentItem1 = new QStandardItem("User Sessions");
    model->appendRow(parentItem1);
    model->setColumnCount(1);
    // 设置模型
    ui->treeView->setModel(model);
    // 隐藏列标题
    ui->treeView->header()->setVisible(false);

    // 展开所有节点
    ui->treeView->expandAll();

    ui->treeView->show();
    // 遍历模型中的所有项并设置为不可编辑
    for (int i = 0; i < model->rowCount(); ++i) {
        QStandardItem *item = model->item(i);
        item->setEditable(false);
        // 如果项有子项，也递归设置子项为不可编辑
        for (int j = 0; j < item->rowCount(); ++j) {
            item->child(i, 0)->setEditable(false);
        }
    }
    /********************************** 设置 treeView ************************/

    /********************************** 设置tabwidget ************************/
    ui->tabWidget->setTabText(0,"HOME");
    ui->tabWidget->setTabsClosable(true);
    ui->tabWidget->tabBar()->setTabButton(0,QTabBar::RightSide,nullptr);	 //第一个tab取消关闭按钮
    /********************************** 设置tabwidget ************************/
}


/*****************************************************
 *  @author:Yz
 *  @brief:退出
 *  @para:void
 *  @return:void
 *  @date:2024/11/25
 *  @version:1.0
 * ***************************************************/
void MainWindow::on_actionQuit_triggered()
{
    this->close();
}

/*****************************************************
 *  @author:Yz
 *  @brief:退出
 *  @para:void
 *  @return:void
 *  @date:2024/11/25
 *  @version:1.0
 * ***************************************************/
void MainWindow::on_btn_quit_clicked()
{
    this->close();
}

/*****************************************************
 *  @author:Yz
 *  @brief:菜单栏新建一个会话
 *  @para:void
 *  @return:void
 *  @date:2024/11/25
 *  @version:1.0
 * ***************************************************/
void MainWindow::on_actionopen_new_tab_triggered()
{
    newSession();
}

/*****************************************************
 *  @author:Yz
 *  @brief:按钮新建一个会话
 *  @para:void
 *  @return:void
 *  @date:2024/11/25
 *  @version:1.0
 * ***************************************************/
void MainWindow::on_btn_Session_clicked()
{
    newSession();
}

/*****************************************************
 *  @author:Yz
 *  @brief:信号与槽实现新建一个串口连接
 *  @para:void
 *  @return:void
 *  @date:2024/11/25
 *  @version:1.0
 * ***************************************************/
void MainWindow::new_Serial_Connection(QString portname, int port_BaudRate)
{
    portname_value = portname;
    portBaudRate_value = port_BaudRate;

    // 首先检查是否已经存在具有相同portname的项
    QStandardItem *userSessionsItem = model->item(0, 0); // 获取顶层节点
    for (int i = 0; i < userSessionsItem->rowCount(); ++i) {
        QStandardItem *item = userSessionsItem->child(i, 0); // 假设只有一个列
        if (item->text() == portname) {
            QMessageBox::critical(this,"警告","已经存在相同的串口");
            return;
        }
    }

    // 创建hostnameItem
    QStandardItem *hostnameItem = new QStandardItem(portname_value);
    hostnameItem->setEditable(false);//设置为不可编辑

    // 将新项添加到顶级节点下
    userSessionsItem->appendRow(hostnameItem);

    // 展开顶级节点以显示新添加的项
    ui->treeView->expandAll();

    //给tabWidget添加一个新的页面
    QWidget *newTab = new QWidget;
    int index;
    index = ui->tabWidget->addTab(newTab,portname_value);
    ui->tabWidget->setCurrentIndex(index);
    itemToTabIndexMap[hostnameItem] = index;
    ui->tabWidget->setTabIcon(index,QIcon(":/res/pic/tabIcon.png"));
}

/*****************************************************
 *  @author:Yz
 *  @brief:新建一个会话
 *  @para:void
 *  @return:void
 *  @date:2024/11/25
 *  @version:1.0
 * ***************************************************/
void MainWindow::newSession()
{
    SessionSetting *sessionSetting = new SessionSetting(this);
    connect(sessionSetting,&SessionSetting::sendHostname_Port,this,&MainWindow::new_Serial_Connection);
    sessionSetting->init();
    sessionSetting->show();
}


/*****************************************************
 *  @author:Yz
 *  @brief:treeWidget双击
 *  @para:void
 *  @return:void
 *  @date:2024/11/25
 *  @version:1.0
 * ***************************************************/
void MainWindow::on_treeView_doubleClicked(const QModelIndex &index)
{
    // 检查索引是否有效且为根目录
    if (index.isValid() && !index.parent().isValid()) {
        qDebug() << "Root directory item double-clicked.";
    } else {
        QStandardItem *item = model->itemFromIndex(index);
        if (item) {
            QString portname = item->text(); // 假设端口名是项的文本
            int portBaudRate = item->data(Qt::UserRole).toInt(); // 假设波特率存储在用户角色数据中

            new_Serial_Connection(portname, portBaudRate);
        }
    }
}

void MainWindow::on_tabWidget_tabCloseRequested(int index)
{
    ui->tabWidget->removeTab(index);
#if 0
    // 更新映射，移除已关闭的标签页项
    QStandardItem *itemToRemove = nullptr;
    for (auto it = itemToTabIndexMap.begin(); it != itemToTabIndexMap.end(); ++it) {
        if (it.value() == index) {
            itemToRemove = it.key();
            break;
        }
    }

    if (itemToRemove) {
        // 从映射中移除
        //itemToTabIndexMap.remove(itemToRemove);

        // 从模型中移除对应的项
        //model->removeRow(itemToRemove->row());
    }

    // 如果需要，重新索引映射中的所有项
    for (int i = 0; i < ui->tabWidget->count(); ++i) {
        int tabIndex = ui->tabWidget->currentIndex();
        QStandardItem *item = model->item(i, 0); // 假设只有一个列
        itemToTabIndexMap[item] = tabIndex;
    }
#endif
}
